package com.kehutong.payfees.service;


import com.kehutong.common.urlconfig.FileUrlConfig;
import com.kehutong.common.urlconfig.WebUrlConfig;
import com.kehutong.payfees.entity.ChargeLawyerMaterial;
import com.kehutong.payfees.entity.ChargeMediation;
import com.kehutong.payfees.entity.ChargeMediationTemplate;
import com.kehutong.payfees.enums.ChargeLawyerMaterialStatus;
import com.kehutong.payfees.enums.ChargeLawyerMaterialType;
import com.kehutong.payfees.enums.TempVar;
import com.kehutong.payfees.util.ESignTreasureUrlConfig;
import org.coraframework.inject.Inject;
import org.coraframework.json.JSON;
import org.coraframework.json.JSONArray;
import org.coraframework.json.JSONObject;
import org.coraframework.logger.Logger;
import org.coraframework.logger.LoggerFactory;
import org.coraframework.mvc.http.result.Result;
import org.coraframework.mvc.webservice.WebService;
import org.coraframework.orm.Pool;
import org.coraframework.util.EnumUtil;
import org.coraframework.util.Objects;
import org.coraframework.util.secret.Base64Coder;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;

//@WebService("/charge/mediation/template")
//public class ChargeMediationTemplateServiceImpl {
//
//    protected Logger logger = LoggerFactory.getLogger(getClass());
//
//    @Inject
//    protected SQLSession sqlSession;
//
//    @Inject
//    private FileUrlConfig fileUrlConfig;
//
//    @Inject
//    private ESignTreasureOAuthServiceImpl eSignTreasureOAuthService;
//
//    @Inject
//    private ESignTreasureUrlConfig eSignTreasureUrlConfig;
//
//    @Inject
//    private WebUrlConfig webUrlConfig;
//
//    public void saveTemplate(ChargeMediationTemplate chargeMediationTemplate) {
//        ChargeMediationTemplate resultChargeMediationTemplate = sqlSession.findOne(ChargeMediationTemplate.class)
//                .eq("type", chargeMediationTemplate.getType())
//                .eq("deleted", false).exe();
//        if (Objects.isNull(resultChargeMediationTemplate)) {
//            sqlSession.insert(chargeMediationTemplate);
//            return;
//        }
//        resultChargeMediationTemplate.setContent(chargeMediationTemplate.getContent());
//        sqlSession.updateById(resultChargeMediationTemplate);
//    }
//
//    public Object getTemplate(JSONObject jsonObject) {
//        return sqlSession.findOne(ChargeMediationTemplate.class)
//                .eq(jsonObject,"type")
//                .eq("deleted", false).exe();
//    }
//
//    public void createFileByTemp(JSONObject jsonObject) throws Exception {
//        ChargeMediationTemplate resultChargeMediationTemplate = sqlSession.findOne(ChargeMediationTemplate.class)
//                .eq(jsonObject,"type")
//                .eq("deleted", false).exe();
//        if (Objects.nonNull(resultChargeMediationTemplate)) {
//            // 由模板替换相关变量
//            String content = replaceVarByTemp(resultChargeMediationTemplate.getContent(), jsonObject);
//            String s = UUID.randomUUID().toString();
//            String htmlPath = System.getProperty("java.io.tmpdir") + File.separator + s + "temp.html";
//            DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH-mm-ss");
//            String fileName;
//            if (Objects.equal(jsonObject.getString("type"), ChargeLawyerMaterialType.REMINDER_LETTER.getId())) {
//                fileName = "催告函-" + LocalDateTime.now().format(dateTimeFormatter) + ".pdf";
//            }else {
//                fileName = "调解书-" + LocalDateTime.now().format(dateTimeFormatter) + ".pdf";
//            }
//
//            String pdfPath = System.getProperty("java.io.tmpdir") + File.separator + fileName;
//            File htmlFile = createHtml(content, htmlPath);
//            File pdfFile = createPDF(htmlPath, pdfPath);
//
//            String contentMd5 = getStringContentMD5(pdfPath);
//            long length = pdfFile.length();
//            // 获取上传文件的url
//            JSONObject resultJSON = eSignTreasureUrlConfig.postESignTreasure("/v1/files/getUploadUrl", (http) -> {
//                JSONObject bodyParams = new JSONObject();
//                bodyParams.put("contentMd5", contentMd5);
//                bodyParams.put("contentType", "application/octet-stream");
//                bodyParams.put("convert2Pdf", false);
//                bodyParams.put("fileName", fileName);
//                bodyParams.put("fileSize", length);
//                http.setBody(bodyParams.toString());
//
//                eSignTreasureOAuthService.setRequestHeaderValue(http);
//            });
//
//            String fileId = resultJSON.getString("fileId");
//            String uploadUrl = resultJSON.getString("uploadUrl");
//            ChargeLawyerMaterial chargeLawyerMaterial = Pool.newInstance(ChargeLawyerMaterial.class);
//            // 上传文件
//            JSONObject resultObject = upload(uploadUrl, pdfFile, contentMd5);
//            if (resultObject != null && resultObject.getInteger("errCode") == 0) {
//                // 发起一步签署
//               eSignTreasureUrlConfig.postESignTreasure("/api/v2/signflows/createFlowOneStep", (http) -> {
//                    JSONObject object = createFlowOneStep(fileId,
//                            fileName,
//                            EnumUtil.getEnum(ChargeLawyerMaterialType.class, jsonObject.getString("type")).getDesc(),
//                            chargeLawyerMaterial.getId());
//                    http.setBody(object.toString());
//                    eSignTreasureOAuthService.setRequestHeaderValue(http);
//                });
//
//                chargeLawyerMaterial.setChargeMediationId(jsonObject.getString("chargeMediationId"));
//                chargeLawyerMaterial.setType(EnumUtil.getEnum(ChargeLawyerMaterialType.class, jsonObject.getString("type")));
//                chargeLawyerMaterial.setFileId(fileId);
//                chargeLawyerMaterial.setFileSuffix(".pdf");
//                chargeLawyerMaterial.setFileName(fileName);
//                chargeLawyerMaterial.setStatus(ChargeLawyerMaterialStatus.UNSEND);
//                chargeLawyerMaterial.setUpload(true);
//                chargeLawyerMaterial.setDeleted(false);
//                sqlSession.insert(chargeLawyerMaterial);
//            }
//            htmlFile.delete();
//            pdfFile.delete();
//        }
//    }

//    public Object callbackFlowEnd(JSONObject jsonObject, String chargeLawyerMaterialId) throws Exception {
//        String action = jsonObject.getString("action");
//        if (Objects.equal("SIGN_FLOW_UPDATE", action)) {
//            return Result.success();
//        }
//
//        String flowId = jsonObject.getString("flowId");
//        String businessScence = jsonObject.getString("businessScence");
//        Integer flowStatus = jsonObject.getInteger("flowStatus");
//        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH-mm-ss");
//        String fileName = businessScence + "-" + LocalDateTime.now().format(dateTimeFormatter) + ".pdf";
//
//        ChargeLawyerMaterial chargeLawyerMaterial = Pool.get(ChargeLawyerMaterial.class, chargeLawyerMaterialId);
//        if (Objects.isNull(chargeLawyerMaterial)) {
//            return Result.error(-1, "数据不存在！");
//        }
//
//        if (Objects.equal(flowStatus, 2) && Objects.nonEmpty(flowId)) {
//            // 获取下载文件地址
//            JSONObject flowDownloadJSONObject = eSignTreasureUrlConfig.getESignTreasure("/v1/signflows/" + flowId + "/documents", (http) -> {
//                eSignTreasureOAuthService.setRequestHeaderValue(http);
//            });
//
//            JSONArray docs = flowDownloadJSONObject.getJSONArray("docs");
//            if (Objects.nonEmpty(docs)) {
//                JSONObject object = (JSONObject) docs.get(0);
//                String fileUrl = object.getString("fileUrl");
//                // 下载文件并上传至文件服务器
//                String resultFileId = eSignTreasureOAuthService.getFileId(fileUrl, fileName);
//                chargeLawyerMaterial.setFileId(resultFileId);
//                sqlSession.updateById(chargeLawyerMaterial);
//                return Result.success();
//            }
//        }
//        return Result.success();
//    }
//
//    /**
//     * 将html页面转为pdf
//     * @param htmlPath
//     * @param pdfPath
//     * @return
//     * @throws Exception
//     */
//    public File createPDF(String htmlPath, String pdfPath) throws Exception {
//        File file = new File(pdfPath);
//        // 校验文件夹目录是否存在，不存在就创建一个目录
//        if (!file.getParentFile().exists()) {
//            file.getParentFile().mkdirs();
//        }
//
//        try {
//            InputStream htmlFileStream = new FileInputStream(htmlPath);
//            // 创建一个document对象实例
//            Document document = new Document();
//            // 为该Document创建一个Writer实例
//            PdfWriter pdfwriter = PdfWriter.getInstance(document,
//                    new FileOutputStream(file));
//            pdfwriter.setViewerPreferences(PdfWriter.HideToolbar);
//            // 打开当前的document
//            document.open();
//            InputStreamReader isr = new InputStreamReader(htmlFileStream, "UTF-8");
//            XMLWorkerHelper.getInstance().parseXHtml(pdfwriter, document,htmlFileStream,null,null,new MyFontsProvider());
//            //XMLWorkerHelper.getInstance().p
//            document.close();
//
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//
//        return file;
//    }
//
//    /**
//     * 替换模板中的变量
//     * @param content
//     * @param jsonObject
//     * @return
//     */
//    private String replaceVarByTemp(String content, JSONObject jsonObject) {
//        List<TempVar> tempVars = Arrays.asList(TempVar.values());
//        ChargeMediation chargeMediation = Pool.get(ChargeMediation.class, jsonObject.getString("chargeMediationId"));
//        jsonObject.put("communityName", chargeMediation.getCommunityName());
//        jsonObject.put("respondent", chargeMediation.getRespondent());
//        if(Objects.nonNull(chargeMediation.getUnitName())){
//            jsonObject.put("houseName", chargeMediation.getBuildingName() + "-" + chargeMediation.getUnitName() + "-" + chargeMediation.getHouseName());
//        }else{
//            jsonObject.put("houseName", chargeMediation.getBuildingName() + "-" + chargeMediation.getHouseName());
//        }
//        jsonObject.put("oweAmount", chargeMediation.getOweAmount());
//        jsonObject.put("employeeName", chargeMediation.getEmployeeName());
//        jsonObject.put("chargeAddress", "变量未配置");//收费处地址
//        jsonObject.put("accountBank", "变量未配置");// 开户银行
//        jsonObject.put("accountName", "变量未配置"); //账户名称
//        jsonObject.put("accountNo", "变量未配置");// 账户号码
//        jsonObject.put("lawyerPhone", Objects.nonEmpty(chargeMediation.getHandlerMobile()) ? chargeMediation.getHandlerMobile() : "变量未配置");
//        jsonObject.put("date", LocalDate.now());
//
//        for (int i = 0; i < tempVars.size(); i++) {
//            if (content.contains(tempVars.get(i).getId())) {
//                String field = jsonObject.getString(tempVars.get(i).getField());
//               if(Objects.nonEmpty(field)) {
//                    content = content.replace(tempVars.get(i).getId(), field);
//                }
//            }
//        }
//        logger.info("前content: {}", content);
//        content = content.replaceAll("<br>", "<br></br>");
//
//        String[] replaceVal = {"left", "center", "right", "justify"};
//        for (int i = 0; i < replaceVal.length; i++) {
//            content = content.replaceAll("class=\"ql-align-" + replaceVal[i] + "\"", "style=\"text-align: " + replaceVal[i] + "\"");
//        }
//        content = content.replaceAll("  ", "&nbsp;&nbsp;");
//
//        String fileUri = fileUrlConfig.getUrl();
//        StringBuilder sb = new StringBuilder(content);
//        int imgTagIndex = sb.indexOf("<img");
//        while (imgTagIndex != -1) {
//            int relativeFileUriIndex = sb.indexOf("/file/show/", imgTagIndex);
//            sb.insert(sb.indexOf(">", relativeFileUriIndex) + 1, "</img>");
//            sb.insert(relativeFileUriIndex, fileUri);
//            imgTagIndex = sb.indexOf("<img", imgTagIndex + 1);
//        }
//        logger.info("处理后content: {}", sb.toString());
//        return sb.toString();
//    }
//
//    /**
//     * 将html代码转为页面
//     * @return
//     */
//    private File createHtml(String content, String htmlPath) {
//        File file = new File(htmlPath);
//        // 校验文件夹目录是否存在，不存在就创建一个目录
//        if (!file.getParentFile().exists()) {
//            file.getParentFile().mkdirs();
//        }
//
//        //用于存储html字符串
//        StringBuilder stringHtml = new StringBuilder();
//        PrintStream printStream = null;
//        try {
//            //打开文件
//            printStream = new PrintStream(new FileOutputStream(file));
//        } catch (FileNotFoundException e) {
//            e.printStackTrace();
//        }
//        //输入HTML文件内容
//        stringHtml.append("<html><head>");
//        stringHtml.append("</head>");
//        stringHtml.append("<body>");
//        stringHtml.append(content);
//        stringHtml.append("</body></html>");
//        try {
//            //将HTML文件内容写入文件中
//            printStream.println(stringHtml.toString());
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//        return file;
//    }
//
//    /***
//     * 计算字符串的Content-MD5
//     * @param str 文件路径
//     * @return
//     */
//    public static String getStringContentMD5(String str) {
//        // 获取文件MD5的二进制数组（128位）
//        byte[] bytes = getFileMD5Bytes1282(str);
//        // 对文件MD5的二进制数组进行base64编码
//        return new String(Base64Coder.encode(bytes));
//    }
//
//    /***
//     * 获取文件MD5-二进制数组（128位）
//     *
//     * @param filePath
//     * @return
//     * @throws IOException
//     */
//    private static byte[] getFileMD5Bytes1282(String filePath) {
//        FileInputStream fis = null;
//        byte[] md5Bytes = null;
//        try {
//            File file = new File(filePath);
//            fis = new FileInputStream(file);
//            MessageDigest md5 = MessageDigest.getInstance("MD5");
//            byte[] buffer = new byte[1024];
//            int length = -1;
//            while ((length = fis.read(buffer, 0, 1024)) != -1) {
//                md5.update(buffer, 0, length);
//            }
//            md5Bytes = md5.digest();
//            fis.close();
//        } catch (FileNotFoundException e) {
//            System.out.println(e.getMessage());
//            e.printStackTrace();
//        } catch (NoSuchAlgorithmException e) {
//            System.out.println(e.getMessage());
//            e.printStackTrace();
//        } catch (IOException e) {
//            System.out.println(e.getMessage());
//            e.printStackTrace();
//        }
//        return md5Bytes;
//    }
//
//    /**
//     * 上传文件到e签宝
//     * @param url
//     * @param file
//     * @param contentMd5
//     * @return
//     * @throws IOException
//     */
//    private JSONObject upload(String url, File file, String contentMd5) throws IOException {
//        String result = "";
//        try {
//            URL realUrl = new URL(url);
//            // 打开和URL之间的连接
//            HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection();
//            // 设置通用的请求属性
//            conn.setRequestProperty("accept", "*/*");
//            conn.setRequestProperty("connection", "Keep-Alive");
//            conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
//            conn.setRequestProperty("Content-Type", "application/octet-stream");
//            conn.setRequestProperty("Content-MD5", contentMd5);
//            // 发送POST请求必须设置如下两行
//            conn.setDoOutput(true);
//            conn.setDoInput(true);
//            conn.setRequestMethod("PUT");
//            conn.setUseCaches(false);
//            conn.setInstanceFollowRedirects(true);
//
//            // 发送请求参数
//            BufferedOutputStream  bos=new BufferedOutputStream (conn.getOutputStream());
//
//            InputStream is = new FileInputStream(file);
//            BufferedInputStream bis = new BufferedInputStream(is);
//
//            byte[] buf= new byte[1024];
//            int length = 0;
//            length = bis.read(buf);
//            while(length!=-1) {
//                bos.write(buf, 0, length);
//                length = bis.read(buf);
//            }
//            bis.close();
//            is.close();
//            bos.close();
//
//
//            // 定义BufferedReader输入流来读取URL的响应
//            if (conn.getResponseCode() == 200) {
//                InputStreamReader isr = new InputStreamReader(conn.getInputStream());
//                BufferedReader br = new BufferedReader(isr);
//                String inputLine = null;
//                while ((inputLine = br.readLine()) != null) {
//                    result += inputLine;
//                }
//                isr.close();
//                conn.disconnect();
//                return JSON.parseObject(result);
//            }
//            conn.disconnect();
//        } catch (Exception e) {
//            System.out.println("异常," + e.getMessage());
//            e.printStackTrace();
//        }
//
//        return null;
//    }
//
//    /**
//     * 一步发起签署
//     * @param fileName
//     * @throws Exception
//     */
//    private JSONObject createFlowOneStep(String fileId, String fileName, String businessScene, String chargeMediationId) throws Exception {
//        JSONObject bodyParams = new JSONObject();
//
//        // 待签署文件信息
//        JSONArray docs = new JSONArray();
//        JSONObject doc = new JSONObject();
//        doc.put("fileId", fileId);
//        doc.put("fileName", fileName);
//        docs.add(doc);
//
//        // 本次签署流程的基本信息
//        JSONObject flowInfo = new JSONObject();
//        flowInfo.put("businessScene", businessScene);
//        flowInfo.put("autoArchive", true);
//        flowInfo.put("autoInitiate", true);
//
//        JSONObject flowConfigInfo = new JSONObject();
//        flowConfigInfo.put("noticeDeveloperUrl", webUrlConfig.getUrl("/admin/charge/mediation/template/call/" + chargeMediationId));
//        flowConfigInfo.put("noticeType", "");
//        flowInfo.put("flowConfigInfo", flowConfigInfo);
//
//        //本次签署流程添加的签署区的列表信息
//        JSONArray signers = new JSONArray();
//        JSONObject signer = new JSONObject();
//        signer.put("platformSign", true);
//
//
//        //签署方签署的文件列表信息
//        JSONArray signfields = new JSONArray();
//        JSONObject signfield = new JSONObject();
//        signfield.put("autoExecute", true);
//        signfield.put("actorIndentityType", "2");
//        signfield.put("fileId", fileId);
//        signfield.put("sealType", "1");
//        signfield.put("signType", "1");
//
//        //签署区位置信息
//        JSONObject posBean = new JSONObject();
//        posBean.put("posPage", "1");
//        posBean.put("posX", "450"); //todo 可根据关键字进行定位
//        posBean.put("posY", "100");
//        signfield.put("posBean", posBean);
//        signer.put("signfields", signfields);
//
//        signfields.add(signfield);
//        signers.add(signer);
//
//        bodyParams.put("docs", docs);
//        bodyParams.put("flowInfo", flowInfo);
//        bodyParams.put("signers", signers);
//
//        return bodyParams;
//    }
//}